// http-errors 是一个 Node.js 模块，它提供了一种方便的方式来创建 HTTP 错误对象。在 Node.js 中，
// HTTP 错误对象用于表示与 HTTP 请求和响应相关的错误状态。http-errors 模块使得创建这些错误对象变得更加简单和一致。


// app.use() 是 Express 框架中用于注册中间件的方法。
// 中间件是一个函数，它可以在请求到达路由处理器之前或之后执行一些操作。
// app.use() 允许你将中间件绑定到应用程序的路径，以便对特定路径或所有路径的请求进行处理。
// app.use([path,] callback[, callback, ...])
// path（可选）：指定中间件绑定的路径。如果省略，中间件将绑定到所有路径上。
// callback：中间件函数，它接收4个参数：err(错误对象)、req（请求对象）、res（响应对象）、next（回调函数，用于将控制传递给下一个中间件或路由处理器）。
// 使用 app.use() 时，你可以：
// 1.绑定中间件到所有路径：
// app.use((req, res, next) => {
//   // 中间件逻辑
//   next();
// });
// 2.绑定中间件到特定路径：
// app.use('/special', (req, res, next) => {
//   // 中间件逻辑，仅在请求路径为 /special 时执行
//   next();
// });
// 3.使用多个中间件：
// app.use('/api', middleware1, middleware2, (req, res, next) => {
//   // 中间件逻辑
//   next();
// });
// 在这里，middleware1 和 middleware2 是两个其他的中间件函数，它们会按照注册的顺序依次执行。



var createError = require('http-errors');
// 创建一个 404 Not Found 错误
const notFoundError = createError(404, 'Not Found');
var express = require('express');
var path = require('path');
// cookie-parser是一个 Node.js 中的中间件，用于解析 HTTP 请求中的 cookie，
// 并将解析后的 cookie 数据添加到请求对象（req对象）中。它是 Express 框架中常用的中间件之一。
// app.use(cookieParser());
// 请注意，cookie-parser 不提供加密或签名 cookie 的功能。
// 如果需要对 cookie 进行安全处理，你可能需要结合其他中间件或手动处理。
// 在生产环境中，通常建议使用专门的 cookie 处理工具，如 cookie-session 或 express-session，以提供更多的安全性功能。
var cookieParser = require('cookie-parser');
// morgan 是一个 Node.js 模块，用于生成 HTTP 请求的日志。它是 Express 框架的一个常用中间件，
// 也可以与其他 Node.js 的 HTTP 服务器一起使用。morgan 可以记录请求的详细信息，
// 如请求方法、URL、状态码、响应时间等，有助于开发者进行调试和监控。
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// 这一行代码配置了视图文件的存放路径。
app.set('views', path.join(__dirname, 'views'));
// 这一行代码配置了视图引擎。app.set('view engine', ...) 表示设置 Express 应用所使用的视图引擎。
// 在这里，视图引擎被设置为 'ejs'，即 Embedded JavaScript。这意味着 Express 将使用 EJS 模板引擎来渲染视图文件。
// 当视图引擎被设置为 'ejs' 后，Express 将默认使用 EJS 引擎来解析和渲染视图文件。
// 这使得你可以在视图文件中嵌入 JavaScript 代码，方便动态地生成 HTML 内容。
app.set('view engine', 'ejs');
// 使用 'dev' 预定义格式记录请求日志。这个预定义格式包含了一些常用的信息，以方便开发者进行调试。
// 具体而言，'dev' 格式通常包括以下信息：
// 请求方法（HTTP 方法）
// 请求路径（URL）
// HTTP 状态码
// 响应时间（以毫秒为单位）

// 常见格式 combined common short tiny dev
app.use(logger('dev'));
app.use(cookieParser());
// 这行代码使用 express.json() 中间件，用于解析传入请求的 JSON 数据。
// 当客户端通过 POST 请求发送 JSON 数据时，这个中间件会解析请求体中的 JSON 数据，
// 并将其转换为 JavaScript 对象，然后将其附加到请求对象的 body 属性上。
app.use(express.json());
// 用于解析传入请求的 URL 编码数据。
// 当客户端通过 POST 请求发送表单数据时，这个中间件会解析  请求体  中的 URL 编码数据，
// 并将其转换为键值对形式的对象，然后将其附加到请求对象的 body 属性上。
// { extended: false } 选项表示使用 Node.js 内置的 querystring 库来解析 URL 编码数据。如果设置为 true，则使用第三方库 qs 来解析。
// express.urlencoded() 中间件用于解析这种请求体中的 URL 编码数据（username=john_doe&password=secretpassword）。
app.use(express.urlencoded({ extended: false }));
// 这行代码使用 express.static 中间件，用于提供静态文件服务。
// 它指定了一个目录（在这里是 'public'），其中的静态文件（如图片、CSS 文件、JavaScript 文件等）可以被直接访问。
// 当你访问 /public/file.txt，Express 将会在 public 目录下查找并返回 file.txt。
app.use(express.static(path.join(__dirname, 'public')));
// 在 Express 应用中，app.use('/', indexRouter); 的含义是将 
// indexRouter 中定义的路由和中间件挂载到根路径 / 上。这是 Express 中用于组织路由的一种方式。
app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(notFoundError);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
